import { fetch } from '@system.fetch'

class RequestHttp {
  // 定义成员变量
  baseURL

  constructor(config) {
    this.baseURL = config.baseURL || ''
  }

  /**
   * 处理请求 URL
   */
  handleUrl(url) {
    // 如果是绝对路径则不拼接 baseURL
    if (url.startsWith('http://') || url.startsWith('https://')) {
      return url
    }
    return this.baseURL + url
  }

  /**
   * 请求拦截器
   */
  requestInterceptor(config) {
    // 可以在这里添加 token 等逻辑
    // const token = accessStore.accessToken;
    // if (token) {
    //   config.headers.Authorization = `Bearer ${token}`;
    // }
    return config
  }

  /**
   * 响应拦截器
   */
  async responseInterceptor(response) {
    const data = response.data;
    if (data.code != 200) {
      return this.handleError(data)
    }
    // console.log('response响应拦截器', response)
    return response.data
  }

  /**
   * 错误处理
   */
  handleError(error) {
    
    if (error.code) {
      switch (error.code) {
        // 登录过期
        case RequestEnums.OVERDUE:
          console.log('登录已过期，请重新登录')
          break
        // 服务器错误
        case RequestEnums.ERROR:
          console.error('服务器错误:', error)
          return Promise.reject(error.message)
        default:
          console.error('请求错误:', error)
      }
    } else {
      console.log(error)
      console.error('网络错误或请求被中断')
    }
    return Promise.reject(error.message ?? error)
  }

  /**
   * 核心请求方法
   */
  async request(url, method = 'get', params = {}) {
    try {
      // 处理 URL 和参数
      const fullUrl = this.handleUrl(url)

      console.log(fullUrl, params)

      // 执行请求
      const response = await fetch({
        url: fullUrl,
        method: method,
        data: params,
        responseType: 'json',
      })
      const resp = response.data;
      if (resp.code == 200) {
        return this.responseInterceptor(resp)
      } else {
        return this.handleError(resp)
      }
    } catch (error) {
      return this.handleError(error)
      // return this.handleError(error)
    }
  }

  // 快捷请求方法
  get(url, params) {
    return this.request(url, 'get', params)
  }

  post(url, params) {
    return this.request(url, 'post', params)
  }
}

// 请求状态枚举
const RequestEnums = {
  OVERDUE: 401, // 登录失效
  FAIL: 999, // 请求失败
  SUCCESS: 200, // 请求成功
  ERROR: 500, // 服务器故障
}

// 响应数据枚举
const ResponseEnums = {
  SUCCESS: 1, // 请求成功
  FAIL: 0, // 请求失败
  OVERDUE: 401, // 登录失效
}

export default RequestHttp
